package com.alan.activemq.p2p;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * 定义消息生产者
 * Created by Alan on 2017/8/7.
 */
public class JmsProducer {

    private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
    private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
    private static final String BROKERURL = ActiveMQConnection.DEFAULT_BROKER_URL;

    public static void main(String[] args) {
        ConnectionFactory connectionFactory;//消息中间件的链接工厂
        Connection connection = null;//链接
        Session session = null;//会话
        Destination destination;;//消息的目的地
        MessageProducer messageProducer = null;//消息生产者

        //实例化连接工厂，创建一个连接
        connectionFactory = new ActiveMQConnectionFactory(JmsProducer.USERNAME,JmsProducer.PASSWORD,JmsProducer.BROKERURL);

        //通过连接工厂获取链接
        try {
            connection = connectionFactory.createConnection();

        //启动链接
        connection.start();;

        //创建sessin，进行消息的发送
        session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);

        //创建消息队列（两边名字要一样）
        destination = session.createQueue("mytest");
//             Session session = connection.createSession(paramA,paramB);
//             paramA是设置事务，paramB是设置acknowledgment mode
//             paramA 取值有：
//             1、true：支持事务
//             为true时：paramB的值忽略， acknowledgment mode被jms服务器设置为SESSION_TRANSACTED 。 　
//             2、false：不支持事务
//             为false时：paramB的值可为Session.AUTO_ACKNOWLEDGE、Session.CLIENT_ACKNOWLEDGE、DUPS_OK_ACKNOWLEDGE其中一个。
//             paramB 取值有：
//             1、Session.AUTO_ACKNOWLEDGE：为自动确认，客户端发送和接收消息不需要做额外的工作。
//             2、Session.CLIENT_ACKNOWLEDGE：为客户端确认。客户端接收到消息后，必须调用javax.jms.Message的acknowledge方法。jms服务器才会删除消息。
//             3、DUPS_OK_ACKNOWLEDGE：允许副本的确认模式。一旦接收方应用程序的方法调用从处理消息处返回，会话对象就会确认消息的接收；而且允许重复确认。在需要考虑资源使用时，这种模式非常有效。
//             4、SESSION_TRANSACTED
        //创建一个消息生产者
        messageProducer = session.createProducer(destination);

        //模拟发送消息
        for (int i = 0; i < 5; i++){
            TextMessage textMessage = session.createTextMessage("my test "+i);
            System.out.println("send text:"+textMessage.getText());
            messageProducer.send(textMessage);
        }

        //如果设置的事物，session就必须要提交
        session.commit();
        } catch (JMSException e) {
            e.printStackTrace();
        }finally {
            if (connection != null){
                try {
                    connection.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        }

    }

}
